﻿namespace MicroCloud.Filter
{
    /// <summary>
    /// 筛选条件
    /// </summary>
    public class FilterRule
    {
        #region 构造函数
        /// <summary>
        /// 初始化一个筛选条件 <see cref="FilterRule"/> 的新实例
        /// </summary>
        public FilterRule()
            : this(null, null)
        { }

        /// <summary>
        /// 使用指定 数据名称、数据值 初始化一个筛选条件 <see cref="FilterRule"/> 的新实例
        /// </summary>
        /// <param name="field">数据名称</param>
        /// <param name="value">数据值</param>
        public FilterRule(string field, object value)
            : this(field, value, FilterOperate.Equal)
        { }

        /// <summary>
        /// 使用指定 数据名称、数据值、操作方式的前台码 初始化一个筛选条件 <see cref="FilterRule"/> 的新实例
        /// </summary>
        /// <param name="field">数据名称</param>
        /// <param name="value">数据值</param>
        /// <param name="operateCode">操作方式的前台码</param>
        public FilterRule(string field, object value, string operateCode)
            : this(field, value, FilterHelper.GetFilterOperate(operateCode))
        { }

        /// <summary>
        /// 使用指定 数据名称、数据值、操作方式 初始化一个筛选条件 <see cref="FilterRule"/> 的新实例
        /// </summary>
        /// <param name="field">数据名称</param>
        /// <param name="value">数据值</param>
        /// <param name="operate">操作方式</param>
        public FilterRule(string field, object value, FilterOperate operate)
        {
            Field = field;
            Value = value;
            Operate = operate;
        }

        #endregion

        #region 属性
        /// <summary>
        /// 获取或设置 属性名称
        /// </summary>
        public string Field { get; set; }

        /// <summary>
        /// 获取或设置 属性值
        /// </summary>
        public object Value { get; set; }

        /// <summary>
        /// 获取或设置 操作类型
        /// </summary>
        public FilterOperate Operate { get; set; }

        /// <summary>
        /// 获取或设置 是否将属性名称驼峰(lowerCase)写法转换为帕斯卡(UpperCase)写法
        /// </summary>
        public bool IsLowerCaseToUpperCase { get; set; } = true;

        /// <summary>
        /// 获取或设置 非外键关联查询的实体类型
        /// </summary>
        public string JoinEntityType { get; set; }

        /// <summary>
        /// 获取或设置 非外键关联查询的过滤字段名
        /// </summary>
        public string JoinFilterField { get; set; }

        /// <summary>
        /// 获取或设置 非外键关联查询的选择字段名
        /// </summary>
        public string JoinSelectField { get; set; }

        #endregion

        #region 方法 Overrides of Object
        /// <summary>
        /// 确定指定的对象是否等于当前对象
        /// </summary>
        /// <param name="obj">要与当前对象进行比较的对象</param>
        /// <returns>如果指定的对象等于当前对象，则为true；否则为false</returns>
        public override bool Equals(object obj)
        {
            if (obj is not FilterRule rule)
            {
                return false;
            }
            return rule.Field == Field && rule.Value == Value && rule.Operate == Operate;
        }

        /// <summary>
        /// 用作默认哈希函数
        /// </summary>
        /// <returns>当前对象的哈希代码</returns>
        public override int GetHashCode()
        {
            return HashCode.Combine(Field, Value, Operate);
        }

        #endregion

    }

}
